--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / rnode / Nrf52DfuFlasher.js
Displaying Raw • Download
meshchatx/src/frontend/js/rnode/Nrf52DfuFlasher.js c0b0ddffd735a0d007c1be9a5e8563ec42fdafc0 (c0b0ddff) Text, 8.51 KB
Tff7b72export Tff7b72default Tff7b72class Te6edf3Nrf52DfuFlasher Tb4b4b4{
Te6edf3DFU_TOUCH_BAUD Tff7b72= T79c0ff1200Tb4b4b4;
Te6edf3SERIAL_PORT_OPEN_WAIT_TIME Tff7b72= T79c0ff0.1Tb4b4b4;
Te6edf3TOUCH_RESET_WAIT_TIME Tff7b72= T79c0ff1.5Tb4b4b4;
Te6edf3FLASH_BAUD Tff7b72= T79c0ff115200Tb4b4b4;
Te6edf3HEX_TYPE_APPLICATION Tff7b72= T79c0ff4Tb4b4b4;
Te6edf3DFU_INIT_PACKET Tff7b72= T79c0ff1Tb4b4b4;
Te6edf3DFU_START_PACKET Tff7b72= T79c0ff3Tb4b4b4;
Te6edf3DFU_DATA_PACKET Tff7b72= T79c0ff4Tb4b4b4;
Te6edf3DFU_STOP_DATA_PACKET Tff7b72= T79c0ff5Tb4b4b4;
Te6edf3DATA_INTEGRITY_CHECK_PRESENT Tff7b72= T79c0ff1Tb4b4b4;
Te6edf3RELIABLE_PACKET Tff7b72= T79c0ff1Tb4b4b4;
Te6edf3HCI_PACKET_TYPE Tff7b72= T79c0ff14Tb4b4b4;
Te6edf3FLASH_PAGE_SIZE Tff7b72= T79c0ff4096Tb4b4b4;
Te6edf3FLASH_PAGE_ERASE_TIME Tff7b72= T79c0ff0.0897Tb4b4b4;
Te6edf3FLASH_WORD_WRITE_TIME Tff7b72= T79c0ff0.0001Tb4b4b4;
Te6edf3FLASH_PAGE_WRITE_TIME Tff7b72= Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_SIZE Tff7b72/ T79c0ff4Tb4b4b4) Tff7b72* Tff7b72thisTb4b4b4.Te6edf3FLASH_WORD_WRITE_TIMETb4b4b4;
T8b949e// The DFU packet max size
Te6edf3DFU_PACKET_MAX_SIZE Tff7b72= T79c0ff512Tb4b4b4;
Tff7b72constructorTb4b4b4(Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3serialPort Tff7b72= Te6edf3serialPortTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sequenceNumber Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sd_size Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3total_size Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Waits for the provided milliseconds, and then resolves.
* @param millis
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3sleepMillisTb4b4b4(Te6edf3millisTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3setTimeoutTb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3millisTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Writes the provided data to the Serial Port.
* @param data
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3sendPacketTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3writer Tff7b72= Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3writableTb4b4b4.Te6edf3getWriterTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Te6edf3writerTb4b4b4.Te6edf3releaseLockTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Puts an nRF52 board into DFU mode by quickly opening and closing a serial port.
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3enterDfuModeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3openTb4b4b4(Tb4b4b4{
Te6edf3baudRateTff7b72: Tff7b72thisTb4b4b4.Te6edf3DFU_TOUCH_BAUDTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3SERIAL_PORT_OPEN_WAIT_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3TOUCH_RESET_WAIT_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Flashes the provided firmware zip.
* @param firmwareZipBlob
* @param progressCallback
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3flashTb4b4b4(Te6edf3firmwareZipBlobTb4b4b4, Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3blobReader Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3BlobReaderTb4b4b4(Te6edf3firmwareZipBlobTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3zipReader Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3ZipReaderTb4b4b4(Te6edf3blobReaderTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3zipEntries Tff7b72= Tff7b72await Te6edf3zipReaderTb4b4b4.Te6edf3getEntriesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3manifestFile Tff7b72= Te6edf3zipEntriesTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3zipEntryTb4b4b4) Tb4b4b4=> Te6edf3zipEntryTb4b4b4.Te6edf3filename Tff7b72=== Ta5d6ff"manifest.json"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3manifestFileTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"manifest.json not found in firmware file!"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3text Tff7b72= Tff7b72await Te6edf3manifestFileTb4b4b4.Te6edf3getDataTb4b4b4(Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3TextWriterTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3json Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3manifest Tff7b72= Te6edf3jsonTb4b4b4.Te6edf3manifestTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3manifestTb4b4b4.Te6edf3applicationTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3dfuSendImageTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3HEX_TYPE_APPLICATIONTb4b4b4, Te6edf3zipEntriesTb4b4b4, Te6edf3manifestTb4b4b4.Te6edf3applicationTb4b4b4, Te6edf3progressCallbackTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Sends the firmware image to the device in DFU mode.
* @param programMode
* @param zipEntries
* @param firmwareManifest
* @param progressCallback
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3dfuSendImageTb4b4b4(Te6edf3programModeTb4b4b4, Te6edf3zipEntriesTb4b4b4, Te6edf3firmwareManifestTb4b4b4, Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3openTb4b4b4(Tb4b4b4{
Te6edf3baudRateTff7b72: Tff7b72thisTb4b4b4.Te6edf3FLASH_BAUDTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3SERIAL_PORT_OPEN_WAIT_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72var Te6edf3softdeviceSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72var Te6edf3bootloaderSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72var Te6edf3applicationSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3binFile Tff7b72= Te6edf3zipEntriesTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3zipEntryTb4b4b4) Tb4b4b4=> Te6edf3zipEntryTb4b4b4.Te6edf3filename Tff7b72=== Te6edf3firmwareManifestTb4b4b4.Te6edf3bin_fileTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3firmware Tff7b72= Tff7b72await Te6edf3binFileTb4b4b4.Te6edf3getDataTb4b4b4(Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3Uint8ArrayWriterTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3datFile Tff7b72= Te6edf3zipEntriesTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3zipEntryTb4b4b4) Tb4b4b4=> Te6edf3zipEntryTb4b4b4.Te6edf3filename Tff7b72=== Te6edf3firmwareManifestTb4b4b4.Te6edf3dat_fileTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3init_packet Tff7b72= Tff7b72await Te6edf3datFileTb4b4b4.Te6edf3getDataTb4b4b4(Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3Uint8ArrayWriterTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3programMode Tff7b72!== Tff7b72thisTb4b4b4.Te6edf3HEX_TYPE_APPLICATIONTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"not implemented"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3programMode Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3HEX_TYPE_APPLICATIONTb4b4b4) Tb4b4b4{
Te6edf3applicationSize Tff7b72= Te6edf3firmwareTb4b4b4.Te6edf3lengthTb4b4b4;
Tb4b4b4}
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendStartDfuTb4b4b4(Te6edf3programModeTb4b4b4, Te6edf3softdeviceSizeTb4b4b4, Te6edf3bootloaderSizeTb4b4b4, Te6edf3applicationSizeTb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendInitPacketTb4b4b4(Te6edf3init_packetTb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendFirmwareTb4b4b4(Te6edf3firmwareTb4b4b4, Te6edf3progressCallbackTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3calcCrc16Tb4b4b4(Te6edf3binaryDataTb4b4b4, Te6edf3crc Tff7b72= T79c0ff0xffffTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3binaryData Tff7b72instanceof Tffa657Uint8ArrayTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"calcCrc16 requires Uint8Array input"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3b Tff7b72of Te6edf3binaryDataTb4b4b4) Tb4b4b4{
Te6edf3crc Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72>> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0x00ffTb4b4b4) Tff7b72| Tb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xff00Tb4b4b4)Tb4b4b4;
Te6edf3crc Tff7b72^= Te6edf3bTb4b4b4;
Te6edf3crc Tff7b72^= Tb4b4b4(Te6edf3crc Tff7b72& T79c0ff0x00ffTb4b4b4) Tff7b72>> T79c0ff4Tb4b4b4;
Te6edf3crc Tff7b72^= Tb4b4b4(Te6edf3crc Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72<< T79c0ff4Tb4b4b4;
Te6edf3crc Tff7b72^= Tb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72& T79c0ff0x00ffTb4b4b4) Tff7b72<< T79c0ff4Tb4b4b4) Tff7b72<< T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3crc Tff7b72& T79c0ff0xffffTb4b4b4;
Tb4b4b4}
Te6edf3slipEncodeEscCharsTb4b4b4(Te6edf3dataInTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3result Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3dataInTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72let Tff7b72char Tff7b72= Te6edf3dataInTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72char Tff7b72=== T79c0ff0xc0Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xdbTb4b4b4)Tb4b4b4;
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xdcTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72char Tff7b72=== T79c0ff0xdbTb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xdbTb4b4b4)Tb4b4b4;
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xddTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72charTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Te6edf3createHciPacketFromFrameTb4b4b4(Te6edf3frameTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3sequenceNumber Tff7b72= Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3sequenceNumber Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72% T79c0ff8Tb4b4b4;
Tff7b72const Te6edf3slipHeaderBytes Tff7b72= Tff7b72thisTb4b4b4.Te6edf3createSlipHeaderTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3sequenceNumberTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3DATA_INTEGRITY_CHECK_PRESENTTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3RELIABLE_PACKETTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3HCI_PACKET_TYPETb4b4b4,
Te6edf3frameTb4b4b4.Te6edf3length
Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3data Tff7b72= Tb4b4b4[Tb4b4b4...Te6edf3slipHeaderBytesTb4b4b4, Tb4b4b4...Te6edf3frameTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3crc Tff7b72= Tff7b72thisTb4b4b4.Te6edf3calcCrc16Tb4b4b4(Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4, T79c0ff0xffffTb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3crc Tff7b72& T79c0ff0xffTb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72& T79c0ff0xff00Tb4b4b4) Tff7b72>> T79c0ff8Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4[T79c0ff0xc0Tb4b4b4, Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3slipEncodeEscCharsTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4, T79c0ff0xc0Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3getEraseWaitTimeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0.5Tb4b4b4, Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3total_size Tff7b72/ Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_SIZE Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_ERASE_TIMETb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3createImageSizePacketTb4b4b4(Te6edf3softdeviceSize Tff7b72= T79c0ff0Tb4b4b4, Te6edf3bootloaderSize Tff7b72= T79c0ff0Tb4b4b4, Te6edf3appSize Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3softdeviceSizeTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3bootloaderSizeTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3appSizeTb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tff7b72async Te6edf3sendStartDfuTb4b4b4(Te6edf3modeTb4b4b4, Te6edf3softdevice_size Tff7b72= T79c0ff0Tb4b4b4, Te6edf3bootloader_size Tff7b72= T79c0ff0Tb4b4b4, Te6edf3app_size Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3frame Tff7b72= Tb4b4b4[
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_START_PACKETTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3modeTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3createImageSizePacketTb4b4b4(Te6edf3softdevice_sizeTb4b4b4, Te6edf3bootloader_sizeTb4b4b4, Te6edf3app_sizeTb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Te6edf3frameTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sd_size Tff7b72= Te6edf3softdevice_sizeTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3total_size Tff7b72= Te6edf3softdevice_size Tff7b72+ Te6edf3bootloader_size Tff7b72+ Te6edf3app_sizeTb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3getEraseWaitTimeTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Te6edf3sendInitPacketTb4b4b4(Te6edf3initPacketTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3frame Tff7b72= Tb4b4b4[Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_INIT_PACKETTb4b4b4)Tb4b4b4, Tb4b4b4...Te6edf3initPacketTb4b4b4, Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int16ToBytesTb4b4b4(T79c0ff0x0000Tb4b4b4)Tb4b4b4]Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Te6edf3frameTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Te6edf3sendFirmwareTb4b4b4(Te6edf3firmwareTb4b4b4, Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3packets Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72var Te6edf3packetsSent Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3firmwareTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3i Tff7b72+= Tff7b72thisTb4b4b4.Te6edf3DFU_PACKET_MAX_SIZETb4b4b4) Tb4b4b4{
Te6edf3packetsTb4b4b4.Te6edf3pushTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Tb4b4b4[
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_DATA_PACKETTb4b4b4)Tb4b4b4,
Tb4b4b4...Te6edf3firmwareTb4b4b4.Te6edf3sliceTb4b4b4(Te6edf3iTb4b4b4, Te6edf3i Tff7b72+ Tff7b72thisTb4b4b4.Te6edf3DFU_PACKET_MAX_SIZETb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Te6edf3progressCallbackTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3packetsTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Te6edf3packetsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_WRITE_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Te6edf3packetsSentTff7b72++Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3progress Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3packetsSent Tff7b72/ Te6edf3packetsTb4b4b4.Te6edf3lengthTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3progressCallbackTb4b4b4(Te6edf3progressTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Tb4b4b4[Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_STOP_DATA_PACKETTb4b4b4)Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3createSlipHeaderTb4b4b4(Te6edf3seqTb4b4b4, Te6edf3dipTb4b4b4, Te6edf3rpTb4b4b4, Te6edf3pktTypeTb4b4b4, Te6edf3pktLenTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3ints Tff7b72= Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4]Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3seq Tff7b72| Tb4b4b4(Tb4b4b4(Tb4b4b4(Te6edf3seq Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72% T79c0ff8Tb4b4b4) Tff7b72<< T79c0ff3Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3dip Tff7b72<< T79c0ff6Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3rp Tff7b72<< T79c0ff7Tb4b4b4)Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3pktType Tff7b72| Tb4b4b4(Tb4b4b4(Te6edf3pktLen Tff7b72& T79c0ff0x000fTb4b4b4) Tff7b72<< T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3pktLen Tff7b72& T79c0ff0x0ff0Tb4b4b4) Tff7b72>> T79c0ff4Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Tb4b4b4(Tff7b72~Tb4b4b4(Te6edf3intsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72+ Te6edf3intsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72+ Te6edf3intsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4) Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72return Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3intsTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3int32ToBytesTb4b4b4(Te6edf3numTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Te6edf3num Tff7b72& T79c0ff0x000000ffTb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0x0000ff00Tb4b4b4) Tff7b72>> T79c0ff8Tb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0x00ff0000Tb4b4b4) Tff7b72>> T79c0ff16Tb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0xff000000Tb4b4b4) Tff7b72>> T79c0ff24Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3int16ToBytesTb4b4b4(Te6edf3numTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Te6edf3num Tff7b72& T79c0ff0x00ffTb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0xff00Tb4b4b4) Tff7b72>> T79c0ff8Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────